package com.business.action.admin.system;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.business.bean.system.MenuBean;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import net.sf.rose.web.util.WebUtils;

@Controller
@RequestMapping("/admin/path")
public class PathAction {

	/**
	 * 获取WEB工程目录指定的文件夹下，所有的文件路径和文件
	 * @param path     - 指定目录，多级以/隔开
	 * @param alsoFile - true则包含文件夹下的所有文件
	 * @return 返回MiniUI格式的列表菜单目录
	 */
	@ResponseBody
	@RequestMapping("/getWebPath.do")
	public List<MenuBean> getWebPath(String path, boolean alsoFile) {
		// 将所有的html文件全部加载进来
		File file = WebUtils.WEB_APP_PATH;
		if (path != null) {
			if (path.indexOf('/') != -1) {
				String[] arr = StringUtils.split(path, '/');
				for (String name : arr) {
					file = new File(file, name);
				}
			} else {
				file = new File(file, path);
			}
		}
		MenuBean menu = new MenuBean();
		menu.setPath("/");
		for (File f : file.listFiles()) {
			// 获取路径包括文件
			getMenuBean(menu, f, alsoFile);
		}
		List<MenuBean> list = new ArrayList<>();
		for (MenuBean bean : menu.getChildren()) {
			getMenuBeanList(list, bean);
		}
		return list;
	}

	/**
	 * 功能：获取指定目录下所有文件夹或文件的树型结构
	 * @param parent   - 父眼光
	 * @param file     - 文件或文件夹
	 * @param alsoFile - 是否包括文件
	 */
	private void getMenuBean(MenuBean parent, File file, boolean alsoFile) {
		MenuBean menu = new MenuBean();
		if (file.isDirectory()) {
			menu.setLabel(file.getName());
			menu.setParentID(parent.getPath());
			menu.setPath(parent.getPath() + file.getName() + '/');
			for (File f : file.listFiles()) {
				getMenuBean(menu, f, alsoFile);
			}
			parent.getChildren().add(menu);
		} else {
			// if (alsoFile && file.getName().endsWith(".html")) {
			if (alsoFile) {
				menu.setLabel(file.getName());
				menu.setPath(parent.getPath() + file.getName());
				menu.setLabel(menu.getPath());
				menu.setParentID(parent.getPath());
				parent.getChildren().add(menu);
			}
		}
	}

	/**
	 * 功能：将树型结构的文件目录结构转换成MiniUI需要的列表结构
	 * @param list - 列表数据结构
	 * @param menu - 树型数据结构
	 */
	private void getMenuBeanList(List<MenuBean> list, MenuBean menu) {
		list.add(menu);
		for (MenuBean bean : menu.getChildren()) {
			getMenuBeanList(list, bean);
		}
	}
}
